#include <my_head.h>

int main(int argc, const char *argv[]){
    // 创建套接字--买了一个手机
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if(-1 == sockfd)
        ERR_LOG("socket error");
    printf("sockfd = %d\n", sockfd); // 3
    
    // 填充服务器网络信息结构体--办卡
    struct sockaddr_in serveraddr;
    serveraddr.sin_family = AF_INET;
    // 学习阶段 端口号填 8888 6666 等 不冲突即可
    serveraddr.sin_port = htons(8888);
    // ip地址不能乱填 自己的ip地址是多少就填多少 以ifconfig看到的为准
    // 如果只是本机测试 可以使用 127.0.0.1 (本地环回地址)
    serveraddr.sin_addr.s_addr = inet_addr("202.202.202.10");
    socklen_t serveraddr_len = sizeof(serveraddr);

    // 将套接字和服务器网络信息结构体绑定--插卡
    if(-1 == bind(sockfd, (struct sockaddr *)&serveraddr, serveraddr_len))
        ERR_LOG("bind error");

    // 将套接字设置成被动监听状态--开机
    if(-1 == listen(sockfd, 5))
        ERR_LOG("listen error");
    
    // 阻塞等待客户端连接--待机 等别人打电话 有人打电话时 使用分机处理业务 sockfd只负责等连接
    int acceptfd = 0;
    printf("正在等待客户端连接...\n");
    if(-1 == (acceptfd = accept(sockfd, NULL, NULL))){
        ERR_LOG("accept error");
    }
    printf("客户端连接成功..\n");
    // 收发数据
    char buff[128] = {0};
    // 接收客户端发来的数据
    read(acceptfd, buff, sizeof(buff));
    printf("收到客户端发来的数据:[%s]\n", buff);
    // 处理数据
    int lvalue = 0;
    int rvalue = 0;
    char opt = 0;
    int ret = 0;
    sscanf(buff, "%d%c%d", &lvalue, &opt, &rvalue);
    switch(opt){
        case '+':
            ret = lvalue + rvalue;
            break;
        case '-':
            ret = lvalue - rvalue;
            break;
    }
    // 组装应答消息
    memset(buff, 0, sizeof(buff));
    sprintf(buff, "%d", ret);
    // 给客户端发送计算的结果
    write(acceptfd, buff, sizeof(buff));

    // 关闭套接字
    close(acceptfd);
    close(sockfd);

    return 0;
}